﻿using System;
using System.Collections.Generic;
using System.Linq;
using Colorful.Furniture.Extensions;
using Newtonsoft.Json;

namespace Colorful.Furniture.EnterpriseManagement;

/// <summary>
///  成员基础
/// </summary>
public class MemberBaseOutputDto
{
    /// <summary>
    ///  id
    /// </summary>
    public Guid Id { get; set; }

    /// <summary>
    ///  手机号码，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string Mobile { get; set; }

    /// <summary>
    ///  职务信息
    /// </summary>
    public string Position { get; set; }

    /// <summary>
    ///  成员名称；第三方不可获取，调用时返回userid以代替name；代开发自建应用需要管理员授权才返回；对于非第三方创建的成员，第三方通讯录应用也不可获取；未返回name的情况需要通过通讯录展示组件来展示名字
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    ///  邮箱
    /// </summary>
    public string Email { get; set; }

    /// <summary>
    ///  企业邮箱
    /// </summary>
    public string BizMail { get; set; }

    /// <summary>
    /// 性别。0表示未定义，1表示男性，2表示女性。第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段。注：不可获取指返回值0
    /// </summary>
    public int Gender { get; set; }

    /// <summary>
    ///  性别标记
    /// </summary>
    public string GenderTag
    {
        get
        {
            switch (Gender)
            {
                case 0:
                    return "未知";
                case 1:
                    return "男";
                case 2:
                    return "女";
                default:
                    return "未知";
            }
        }
    }

    /// <summary>
    ///  头像url。 第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
    /// </summary>
    public string ThumbAvatar { get; set; }

    /// <summary>
    ///   激活状态: 1=已激活，2=已禁用，4=未激活，5=退出企业。
    /// 已激活代表已激活企业微信或已关注微信插件（原企业号）。未激活代表既未激活企业微信又未关注微信插件（原企业号）。
    /// </summary>
    public int Status { get; set; }

    /// <summary>
    ///  状态标签
    /// </summary>
    public string StatusTag
    {
        get
        {
            switch (Status)
            {
                case 1:
                    return "已激活";
                case 0:
                    return "已删除";
                case 2:
                    return "已禁用";
                case 4:
                    return "未激活";
                case 5:
                    return "退出企业";
                default:
                    return "未知";
            }
        }
    }

    /// <summary>
    ///  标签颜色
    /// </summary>
    public string StatusColor
    {
        get
        {
            switch (Status)
            {
                case 1:
                    return "success";
                case 2:
                    return "info";
                case 4:
                    return "warning";
                case 0:
                case 5:
                    return "danger";
                default:
                    return "primary";
            }
        }
    }

    /// <summary>
    ///  头像url。 第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
    /// </summary>
    public string Avatar { get; set; }
}

/// <summary>
///  成员分页列表
/// </summary>
public class MemberPagedOutputDto : MemberBaseOutputDto
{
    /// <summary>
    ///  创建时间
    /// </summary>
    public DateTime AddTime { get; set; }

    /// <summary>
    ///  是否启用
    /// </summary>
    public bool Enable { get; set; }

    /// <summary>
    ///  标签
    /// </summary>
    public string Label { get; set; }

    /// <summary>
    ///  成员帐号
    /// </summary>
    public string UserId { get; set; }

    /// <summary>
    ///  标签列表
    /// </summary>
    public List<LabelOutputDto> LabelList => Label.StringToGeneric<List<LabelOutputDto>>();

    /// <summary>
    ///  标签列表
    /// </summary>
    public string LabelNameList => string.Join(",", LabelList.Select(x => x.Name));

    /// <summary>
    ///  创建时间
    /// </summary>
    public string AddTimeFormat => AddTime.ToDateString();
}

/// <summary>
///  表单信息输出体
/// </summary>
public class MemberFormInfoOutputDto
{
    /// <summary>
    /// 成员UserID。对应管理端的帐号，企业内必须唯一。不区分大小写，长度为1~64个字节
    /// </summary>
    public virtual string UserId { get; set; }

    /// <summary>
    ///  头像
    /// </summary>
    public virtual string ThumbAvatar { get; set; }

    /// <summary>
    ///  手机号码，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string Mobile { get; set; }

    /// <summary>
    ///  成员头像的mediaid，通过素材管理接口上传图片获得的mediaid
    /// </summary>
    public string AvatarMediaId { get; set; }

    /// <summary>
    /// 启用/禁用成员。1表示启用成员，0表示禁用成员
    /// </summary>
    public int Enable { get; set; } = 1;

    /// <summary>
    ///  别名
    /// </summary>
    public string Alias { get; set; }

    /// <summary>
    ///  是否邀请
    /// </summary>
    public virtual bool ToInvite { get; set; }

    /// <summary>
    ///  管理员编码
    /// </summary>
    public Guid? ManagerId { get; set; }

    /// <summary>
    ///  成员名称；第三方不可获取，调用时返回userid以代替name；代开发自建应用需要管理员授权才返回；对于非第三方创建的成员，第三方通讯录应用也不可获取；未返回name的情况需要通过通讯录展示组件来展示名字
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 成员所属部门id列表，仅返回该应用有查看权限的部门id；成员授权模式下，固定返回根部门id，即固定为1。对授权了“组织架构信息”权限的第三方应用，返回成员所属的全部部门id
    /// </summary>
    public List<long> DepartmentList => Department.StringToGeneric<List<long>>();

    /// <summary>
    /// 成员所属部门id列表
    /// </summary>
    [JsonIgnore]
    public string Department { get; set; }

    /// <summary>
    ///  部门内的排序值，默认为0。数量必须和department一致，数值越大排序越前面。值范围是0, 2^32)。[成员授权模式下不返回该字段
    /// </summary>
    public int Sort { get; set; }

    /// <summary>
    ///  职务信息
    /// </summary>
    public string Position { get; set; }

    /// <summary>
    /// 性别。0表示未定义，1表示男性，2表示女性。第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段。注：不可获取指返回值0
    /// </summary>
    public int Gender { get; set; }

    /// <summary>
    ///  邮箱
    /// </summary>
    public string Email { get; set; }

    /// <summary>
    ///  企业邮箱带@后的字符
    /// </summary>
    public string BizMailFull { get; set; }

    /// <summary>
    ///  企业邮箱@前面的数据
    /// </summary>
    public string BizMail { get; set; }
    //{
    //    get
    //    {
    //        var bizMail = BizMailFull.Replace(WorkItemConsts.WorkMailSuffix, "");

    //        return bizMail;
    //    }
    //}

    /// <summary>
    ///  表示在所在的部门内是否为部门负责人,1表示为部门负责人，0表示非部门负责人
    /// </summary>
    public int IsLeaderInDept { get; set; }

    /// <summary>
    ///  直属上级UserID
    /// </summary>
    public List<string> DirectLeaderList => DirectLeader.StringToGeneric<List<string>>();

    /// <summary>
    ///  直属上级UserID
    /// </summary>
    [JsonIgnore]
    public string DirectLeader { get; set; }

    /// <summary>
    ///  座机。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string Telephone { get; set; }

    /// <summary>
    ///  地址。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string Address { get; set; }
}

/// <summary>
///  成员详情
/// </summary>
public class MemberDetailOutputDto : MemberBaseOutputDto
{
    /// <summary>
    /// 成员UserID。对应管理端的帐号，企业内必须唯一。不区分大小写，长度为1~64个字节
    /// </summary>
    public string UserId { get; set; }

    /// <summary>
    ///  管理员编码
    /// </summary>
    public Guid? ManagerId { get; set; }

    /// <summary>
    /// 成员所属部门id列表，仅返回该应用有查看权限的部门id；成员授权模式下，固定返回根部门id，即固定为1。对授权了“组织架构信息”权限的第三方应用，返回成员所属的全部部门id
    /// </summary>
    [JsonIgnore]
    public string Department { get; set; }

    /// <summary>
    ///  成员所属部门id列表
    /// </summary>
    public List<long> DepartmentList => Department.StringToGeneric<List<long>>();

    /// <summary>
    ///  部门内的排序值，默认为0。数量必须和department一致，数值越大排序越前面。值范围是0, 2^32)。[成员授权模式下不返回该字段
    /// </summary>
    public int Sort { get; set; }

    /// <summary>
    ///  表示在所在的部门内是否为部门负责人
    /// </summary>
    public int IsLeaderInDept { get; set; }

    /// <summary>
    ///  直属上级UserID
    /// </summary>
    [JsonIgnore]
    public string DirectLeader { get; set; }

    /// <summary>
    ///  直属上级UserID
    /// </summary>
    public List<string> DirectLeaderList => DirectLeader.StringToGeneric<List<string>>();

    /// <summary>
    ///  座机。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string Telephone { get; set; }

    /// <summary>
    /// 员工个人二维码，扫描可添加为外部联系人(注意返回的是一个url，可在浏览器上打开该url以展示二维码)；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string QrCode { get; set; }

    /// <summary>
    ///  地址。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
    /// </summary>
    public string Address { get; set; }

    /// <summary>
    ///  全局唯一。对于同一个服务商，不同应用获取到企业内同一个成员的open_userid是相同的，最多64个字节。仅第三方应用可获取
    /// </summary>
    public string OpenUserid { get; set; }
}